#define _CRT_SECURE_NO_WARNINGS 1

//#include<iostream>
//#include<cstring>
//
//using namespace std;
//
//const int N = 110;
//
//int h[N], e[N], ne[N], idx;
//int f[N][N];
//int n, m;
//int v[N], w[N];
//
//void add(int a, int b)
//{
//    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
//}
//
//void dfs(int u)
//{
//    for (int i = h[u]; ~i; i = ne[i])
//    {
//        int son = e[i];
//        dfs(son);
//
//        for (int j = m - v[u]; j >= 0; j--)
//            for (int k = 0; k <= j; k++)
//                f[u][j] = max(f[u][j], f[u][j - k] + f[son][k]);
//    }
//
//    for (int i = m; i >= v[u]; i--)    f[u][i] = f[u][i - v[u]] + w[u];
//    for (int i = 0; i < v[u]; i++)     f[u][i] = 0;
//}
//
//int main()
//{
//    cin >> n >> m;
//
//    memset(h, -1, sizeof h);
//    int root;
//    for (int i = 1; i <= n; i++)
//    {
//        int p;
//        cin >> v[i] >> w[i] >> p;
//        if (p == -1) root = i;
//        else add(p, i);
//    }
//
//    dfs(root);
//
//    cout << f[root][m] << endl;
//    return 0;
//}

#include<iostream>
#include<cstring>

using namespace std;

const int N = 1010, MOD = 1e9 + 7;

int f[N], g[N];
int n, m;

int main()
{
    cin >> n >> m;
    f[0] = 0, g[0] = 1;
    for (int i = 0; i < n; i++)
    {
        int v, w;
        cin >> v >> w;
        for (int j = m; j >= v; j--)
        {
            int maxv = max(f[j], f[j - v] + w);
            int cnt = 0;
            if (f[j] == maxv)    cnt += g[j];
            if (f[j - v] + w == maxv)    cnt += g[j - v];
            g[j] = cnt % MOD;
            f[j] = maxv;
        }
    }

    int res = 0;
    for (int i = 0; i <= m; i++)
        res = max(res, f[i]);

    int cnt = 0;
    for (int i = 0; i <= m; i++)
        if (res == f[i])
            cnt = cnt + g[i] % MOD;

    cout << cnt << endl;
    return 0;
}